package com.zx._02_thread.基本操作;

import java.util.concurrent.ArrayBlockingQueue;

/**
 * @version v1.0
 * @Project: 20180808_thread
 * @Title: Leason_2_queue
 * @Description: 阻塞队列
 * @author: zhangxue
 * @date: 2018年8月8日下午10:46:25
 * @company: yooli
 * @Copyright: Copyright (c) 2015
 */
public class Leason_2_queue {

    // 以ArrayBlockQueue为例
//	1. 插入数据
//		抛出异常 		  ：	add(e)//队列未满时，返回true；队列满则抛出IllegalStateException(“Queue full”)异常——AbstractQueue 
//		返回值（非阻塞） ：	offer(e)//队列未满时，返回true；队列满时返回false。非阻塞立即返回。 
//		一定时间内返回值 ：	offer(e, time, unit)//设定等待的时间，如果在指定时间内还不能往队列中插入数据则返回false，插入成功返回true。 
//		返回值（阻塞）   ：	put(e)//队列未满时，直接插入没有返回值；队列满时会阻塞等待，一直等到队列未满时再插入。 
//	2.获得数据
//		抛出异常		  ：remove()//队列不为空时，返回队首值并移除；队列为空时抛出NoSuchElementException()异常——AbstractQueue 
//		返回值（非阻塞） ：poll()//队列不为空时返回队首值并移除；队列为空时返回null。非阻塞立即返回。 
//		一定时间内返回值 ：poll(time, unit)//设定等待的时间，如果在指定时间内队列还未孔则返回null，不为空则返回队首值 
//		返回值（阻塞）   ：	take(e)//队列不为空返回队首值并移除；当队列为空时会阻塞等待，一直等到队列不为空时再返回队首值。 
    public static void main(String[] args) {
        ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(5);//阻塞式队列

        new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                try {
                    queue.put(i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(">>>>>>>>>>>>>>>>>" + i);
            }
        }).start();

        new Thread(() -> {
            while (true) {
                try {
                    Thread.sleep(1000L);
                    System.out.println("############" + queue.take());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

}
